namespace study2_01 {

    // 1.1 基本定义
    class Person {
        name: string
        age: number
        constructor(name: string, age: number) {
            this.name = name
            this.age = age
        }
        greet() {
            console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);

        }
    }
    const person: Person = new Person('lwj', 22)
    person.greet()

    // 1.2 参数属性
    class Animal {
        // 声明和赋值合并至一处
        constructor(private name: string) {

        }

        move(distance: number) {
            console.log(`${this.name} moved ${distance}m.`);
        }
    }
    let cat = new Animal('喵喵')
    cat.move(12)

    // 1.3 访问修饰符

    // 定义员工类
    class Employee {
        public name: string
        private salary: number
        protected department: string

        constructor(name: string, salary: number, department: string) {
            this.name = name
            this.salary = salary
            this.department = department
        }

        getSalary() {
            return this.salary;
        }

    }

    let employee = new Employee('lwj', 8000, '鸿蒙')
    console.log(employee.name); // lwj
    console.log(employee.getSalary()); // 8000


    // 1.4 TS中存取器（Getters 和 Setters）
    // 以下案例是使用存取器管理动物的年龄
    class Animal2 {
        private _age: number = 0
        constructor(public name: string) {

        }
        get age() {
            console.log(`获取 ${this.name} 的年龄`);
            return this._age
        }

        set age(value) {
            if (value < 0) {
                console.log('年龄不能是负数'); // 年龄不能是负数
            } else {
                console.log(`设置 ${this.name} 的年龄为 ${value}`);
                this._age = value;
            }
        }

        printInfo(): void {
            console.log(`${this.name}的年龄是${this.age}岁`); //  熊猫的年龄是10岁
        }

    }

    let animal2 = new Animal2('熊猫')
    animal2.age = 10
    console.log(animal2.age);  // 获取 熊猫 的年龄
    animal2.printInfo()
    animal2.age = -2


    // 1.5 静态成员
    // 类的静态成员（属性或方法）属于类本身，而不是类的实例。静态成员使用 static 关键字定义。
    // 定义一个数学工具类 MathUtils
    class MathUtils {
        static PI: number = 3.14
        static calculateArea(radius: number): number {
            return this.PI * radius * radius
        }

        constructor() {

        }
    }
    console.log(MathUtils.PI); // 3.14
    console.log(MathUtils.calculateArea(10)); // 314



    // 1.6 只读属性
    // readonly 关键字用于定义只读属性，只能在初始化时或在构造函数中赋值，之后不能再修改
    class Car {
        readonly brand: string
        readonly model: string
        constructor(brand: string, model: string) {
            this.brand = brand
            this.model = model
        }

    }

    let car = new Car('特斯拉', 'Model S')
    console.log(car.brand); // 特斯拉
    // car.brand = 'bsj' // 无法为“brand”赋值，因为它是只读属性。




}